package com.infore.common.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class NumberUtil {
	private NumberUtil() {
	};

	private static final String[] pattern = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
	private static final String[] cPattern = { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟" };
	private static final String[] cfPattern = { "角", "分", "" };
	private static final String ZEOR = "零";
	/**
	 * 错误返回结果
	 */
	private static final String msg = "";

	/**
	 * 一串数字小写转大些写
	 * @param numbers
	 * @return
	 */
	public static String LowerToUpper(String number) {
		return LowerToUpper(number, false);
	}

	public static String LowerToUpper(String number, boolean formated) {
		if (StringUtils.isBlank(number)) {
			return ZEOR;
		} else {
			String strs[] = number.split("\\.");
			if (strs.length == 1) {
				return pointPre(strs[0].trim(), formated);
			} else if (strs.length == 2) {
				String pre = pointPre(strs[0].trim(), formated);
				String next = pointNext(strs[1].trim());
				return pre + next;
			} else {
				return ZEOR;
			}
		}
	}

	/**
	 * 小数点前的数据处理
	 * @param number
	 * @return
	 */
	private static String pointPre(String number, boolean formated) {
		String result = "";
		String[] sNumber = number.split("|");
		int size = sNumber.length;
		if (size > 13 || size < 2) {
			return ZEOR;
		}
		for (int i = 1; i < size; i++) {
			int index = Integer.parseInt(sNumber[i]);
			result = result + pattern[index] + cPattern[size - i - 1] + (formated ? " " : "");
		}
		if (formated) {
			for (int tmpsize = size - 1; tmpsize < 6; tmpsize++) {
				result = pattern[0] + cPattern[tmpsize] + " " + result;
			}
		}
		return result;
	}

	/**
	 * 小数点后的数据处理
	 * @param number
	 * @return
	 */
	private static String pointNext(String number) {
		String result = "";
		String[] sNumber = number.split("|");
		int size = sNumber.length;
		if (size > 4 || size < 2) {
			return msg;
		}
		for (int i = 1; i < size; i++) {
			int index = Integer.parseInt(sNumber[i]);
			result = result + pattern[index] + cfPattern[i - 1];
		}
		return result;
	}
	
	/**
	 * 
	  * @Title: Tbjs
	  * @Description: 同比计算，返回四位小数
	  * @author: luo bin
	  * @date 2017年7月6日 上午10:28:05
	  * @最后修改人: luo bin
	  * @最后修改时间：2017年7月6日 上午10:28:05
	  * @param jnje :今年金额
	  * @param qnje ：去年金额
	  * @return
	  * @throws
	 */
	public static BigDecimal Tbjs(BigDecimal jnje,BigDecimal qnje){
		if(qnje.equals(BigDecimal.ZERO)){
			return BigDecimal.ZERO;
		}
		return (jnje.subtract(qnje)).divide(qnje,4,BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * 
	  * @Title: Hbjs
	  * @Description: 环比计算，小数位精度：4位
	  * @author: luo bin
	  * @date 2017年7月6日 上午10:33:18
	  * @最后修改人: luo bin
	  * @最后修改时间：2017年7月6日 上午10:33:18
	  * @param currentJe
	  * @param lastJe
	  * @return
	  * @throws
	 */
	public static BigDecimal Hbjs(BigDecimal currentJe,BigDecimal lastJe){
		if(lastJe.equals(BigDecimal.ZERO)){
			return BigDecimal.ZERO;
		}
		return (currentJe.subtract(lastJe)).divide(lastJe, 4, BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * 
	  * @Title: Zb
	  * @Description: 计算占比
	  * @author: luo bin
	  * @date 2017年7月6日 下午2:45:13
	  * @最后修改人: luo bin
	  * @最后修改时间：2017年7月6日 下午2:45:13
	  * @param currentJe
	  * @param allJe
	  * @return
	  * @throws
	 */
	public static BigDecimal Zb(BigDecimal currentJe,BigDecimal allJe){
		if(allJe.equals(BigDecimal.ZERO)){
			return BigDecimal.ZERO;
		}
		return currentJe.divide(allJe, 4, BigDecimal.ROUND_HALF_UP);
	}
	
	public static String Zb(double currentJe,double allJe){
		if(allJe==0d){
			return "0";
		}else{
			DecimalFormat df = new DecimalFormat("#.00");
			return df.format(currentJe/allJe * 100);
		}
	}
	
	/**
	 * 
	  * @Title: InOneHundred
	  * @Description: 将某一个数字转换成100以内
	  * @author: luo bin
	  * @date 2017年8月3日 下午10:17:59
	  * @最后修改人: luo bin
	  * @最后修改时间：2017年8月3日 下午10:17:59
	  * @param value
	  * @return
	  * @throws
	 */
	public static BigDecimal InOneHundred(BigDecimal value){
		if(null==value){
			return BigDecimal.ZERO;
		}
		BigDecimal Ten = new BigDecimal(10);
		BigDecimal OneHundred = new BigDecimal(100);
		return value.compareTo(OneHundred)==1?InOneHundred(value.divide(Ten,2,BigDecimal.ROUND_HALF_UP)):value;
	}
	
	/**
	 * 
	  * @Title: valueFormatByDw
	  * @Description: 根据单位格式化数据
	  * @author: Ouyang
	  * @date 2018年6月14日 下午4:53:33
	  * @最后修改人: Ouyang
	  * @最后修改时间：2018年6月14日 下午4:53:33
	  * @return
	  * @throws
	 */
	public static BigDecimal valueFormatByDw(BigDecimal value,String zbdw){
		if(StringUtils.isNotEmpty(zbdw)){
			if(zbdw.indexOf("万")!=-1){
				BigDecimal wan= new BigDecimal(10000);
				value = value.divide(wan, 4, BigDecimal.ROUND_HALF_UP);
			}else if(zbdw.indexOf("亿")!=-1){
				BigDecimal wan= new BigDecimal(100000000);
				value = value.divide(wan, 4, BigDecimal.ROUND_HALF_UP);
			}else{
				return value;
			}
		}
		return value;
	}

	public static void main(String[] args) {
		/*System.out.println(LowerToUpper("678.12", false));
		System.out.println(Tbjs(new BigDecimal(10),new BigDecimal(0)));
		System.out.println(Hbjs(new BigDecimal(10),new BigDecimal(0)));*/
		System.out.println(InOneHundred(new BigDecimal(15205)));
	}
}
